public class Solution {
    // DO NOT MODIFY THE ARGUMENTS WITH "final" PREFIX. IT IS READ ONLY
    public int hammingDistance(final int[] A) {
        int countZeros[] = new int[32] ;
        int countOnes[] = new int[32];
        int n = A.length ;
        for(int i = 0 ; i < n ; i++)
        {
            int x = A[i] ;
            for(int bit = 31 ; bit >= 0 ; bit--)
            {
                if(x % 2 == 1)
                  countOnes[bit]++;
                else 
                  countZeros[bit]++;
                x = x >> 1 ;
            }
        }
        int mod = (int)Math.pow(10,9) + 7;
        int ans[] = new int[32] ;
        for(int i = 0 ; i < 32 ; i++)
        {
            ans[i] = ((((countZeros[i] % mod) * (countOnes[i] % mod)) % mod) * 2) % mod ;
        }
        int pairs = 0 ; 
        for(int i = 0 ; i < 32; i++)
        {
            pairs = ((pairs % mod)+ (ans[i] % mod)) % mod ;
        }
        return pairs % m ;
    }
}
